home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / clang / dosrcss.zip / RCSKEEP.C < prev    next >
C/C++ Source or Header  |  1990-07-18  |  9KB  |  315 lines

  1. /*
  2.  *                     RCS keyword extraction
  3.  */
  4. #ifndef lint
  5. static char rcsid[]= "$Id: rcskeep.c,v 5.2 90/07/15 11:34:07 ROOT_DOS Release $ Purdue CS";
  6. #endif
  7. /*****************************************************************************
  8.  *                       main routine: getoldkeys()
  9.  *                       Testprogram: define KEEPTEST
  10.  *****************************************************************************
  11.  */
  12.  
  13. /* Copyright (C) 1982, 1988, 1989 Walter Tichy
  14.    Distributed under license by the Free Software Foundation, Inc.
  15.  
  16. This file is part of RCS.
  17.  
  18. RCS is free software; you can redistribute it and/or modify
  19. it under the terms of the GNU General Public License as published by
  20. the Free Software Foundation; either version 1, or (at your option)
  21. any later version.
  22.  
  23. RCS is distributed in the hope that it will be useful,
  24. but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  26. GNU General Public License for more details.
  27.  
  28. You should have received a copy of the GNU General Public License
  29. along with RCS; see the file COPYING.  If not, write to
  30. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  31.  
  32. Report problems and direct all questions to:
  33.  
  34.     rcs-bugs@cs.purdue.edu
  35.  
  36. */
  37.  
  38.  
  39.  
  40. /* $Log:    rcskeep.c,v $
  41.  * Revision 5.2  90/07/15  11:34:07  ROOT_DOS
  42.  * DOS version of RCS 4.0 checked in for MODS
  43.  * by lfk@athena.mit.edu
  44.  * Also update to MSC 6.0
  45.  * 
  46.  * Revision 4.6  89/05/01  15:12:56  narten
  47.  * changed copyright header to reflect current distribution rules
  48.  * 
  49.  * Revision 4.5  88/11/08  12:01:05  narten
  50.  * changes from  eggert@sm.unisys.com (Paul Eggert)
  51.  * 
  52.  * Revision 4.5  88/08/09  19:13:03  eggert
  53.  * Remove lint and speed up by making FILE *fp local, not global.
  54.  * 
  55.  * Revision 4.4  87/12/18  11:44:21  narten
  56.  * more lint cleanups (Guy Harris)
  57.  * 
  58.  * Revision 4.3  87/10/18  10:35:50  narten
  59.  * Updating version numbers. Changes relative to 1.1 actually relative
  60.  * to 4.1
  61.  * 
  62.  * Revision 1.3  87/09/24  14:00:00  narten
  63.  * Sources now pass through lint (if you ignore printf/sprintf/fprintf 
  64.  * warnings)
  65.  * 
  66.  * Revision 1.2  87/03/27  14:22:29  jenkins
  67.  * Port to suns
  68.  * 
  69.  * Revision 1.1  84/01/23  14:50:30  kcs
  70.  * Initial revision
  71.  * 
  72.  * Revision 4.1  83/05/10  16:26:44  wft
  73.  * Added new markers Id and RCSfile; extraction added.
  74.  * Marker matching with trymatch().
  75.  * 
  76.  * Revision 3.2  82/12/24  12:08:26  wft
  77.  * added missing #endif.
  78.  *
  79.  * Revision 3.1  82/12/04  13:22:41  wft
  80.  * Initial revision.
  81.  *
  82.  */
  83.  
  84. /*
  85. #define KEEPTEST
  86. /* Testprogram; prints out the keyword values found. */
  87.  
  88. #include  "rcsbase.h"
  89. extern char * checkid();
  90. extern FILE * fopen();
  91. static int getval();
  92. extern enum markers trymatch();
  93.  
  94. #define IDLENGTH 30
  95. char prevauthor[IDLENGTH];
  96. char prevdate[datelength];
  97. char prevRCS[NCPFN];
  98. char prevrev[revlength];
  99. char prevsource[NCPPN];
  100. char prevstate [IDLENGTH];
  101. char prevlocker[IDLENGTH];
  102. char dummy[IDLENGTH];
  103.  
  104. getoldkeys(fname)
  105. char * fname;
  106. /* Function: Tries to read keyword values for author, date,
  107.  * revision number, RCS file, (both with and without path),
  108.  * state, and workfilename out of the file fname.
  109.  * The results are placed into
  110.  * prevauthor, prevdate, prevRCS, prevrev, prevsource, prevstate.
  111.  * Aborts immediately if it finds an error and returns false.
  112.  * If it returns true, it doesn't mean that any of the
  113.  * values were found; instead, check to see whether the corresponding arrays
  114.  * contain the empty string.
  115.  */
  116. {
  117.     register FILE *fp;
  118.     register int c;
  119.     char keyword[keylength+2];
  120.     register char * tp;
  121.     enum markers mresult;
  122.  
  123.     /* initialize to empty */
  124.     prevauthor[0]=prevsource[0]=prevstate[0]=prevdate[0]=prevrev[0]= '\0';
  125.  
  126.     if ( (fp = fopen(fname, "r") ) == NULL ) {
  127.        error("Can't open %s\n", fname);
  128.        return false;
  129.     }
  130.     while( (c=getc(fp)) != EOF) {
  131.         if ( c==KDELIM) {
  132.             /* try to get keyword */
  133.             tp = keyword;
  134.         while( (c=getc(fp))!=EOF && (tp< keyword+keylength) && (c!='\n')
  135.            && (c!=KDELIM) && (c!=VDELIM))
  136.           *tp++ = c;
  137.  
  138.             if (c==KDELIM) {VOID ungetc(c,fp);continue;}
  139.             if (c!=VDELIM) continue;
  140.         *tp++ = c;
  141.             *tp='\0';
  142.             while ((c=getc(fp))==' '||c=='\t'); /* skip blanks */
  143.             VOID ungetc(c,fp); /* needed for getval */
  144.  
  145.         switch (mresult=trymatch(keyword,true)) {
  146.             case Author:
  147.         if (getval(fp,prevauthor,IDLENGTH,true))
  148.                     if (!checkid(prevauthor, '\0')) goto errexit;
  149.                 break;
  150.             case Date:
  151.         if (!getprevdate(fp,true)) goto errexit;
  152.                 break;
  153.             case Header:
  154.             case Id:
  155.         if (mresult==Header) {
  156.             if (!getval(fp,prevsource,NCPPN,true)) break; /*unexpanded*/
  157.         } else {
  158.             if (!getval(fp,prevRCS,NCPFN,true))    break; /*unexpanded*/
  159.         }
  160.         if (!getval(fp,prevrev,revlength,false)) goto errexit;
  161.         if (!checknum(prevrev,-1)) {
  162.             error("Bad revision number");
  163.             goto errexit;
  164.         }
  165.         if (!getprevdate(fp,false)) goto errexit;
  166.         if (!getval(fp,prevauthor,IDLENGTH,false)) goto errexit;
  167.         if (!checkid(prevauthor, '\0')) goto errexit;
  168.         if (!getval(fp,prevstate,IDLENGTH,false)) goto errexit;
  169.         if (!checkid(prevstate, '\0')) goto errexit;
  170.         VOID getval(fp, dummy, IDLENGTH, true);    /* optional locker*/
  171.         VOID getval(fp, prevlocker,IDLENGTH,true); /* optional locker*/
  172.                 break;
  173.             case Locker:
  174.                 VOID getval(fp,prevlocker,IDLENGTH,true);
  175.         if (!checkid(prevlocker, '\0')) goto errexit;
  176.                 break;
  177.             case Log:
  178.         VOID getval(fp,prevRCS,NCPPN,true);
  179.                 break;
  180.             case RCSfile:
  181.                 VOID getval(fp,prevRCS,NCPFN,true);
  182.                 break;
  183.             case Revision:
  184.                 if (getval(fp,prevrev,revlength,true))
  185.                     if (!checknum(prevrev,-1)) {
  186.                         error("Bad revision number");
  187.                         goto errexit;
  188.                     }
  189.                 break;
  190.             case Source:
  191.                 VOID getval(fp,prevsource,NCPPN,true);
  192.                 break;
  193.             case State:
  194.                 if (getval(fp,prevstate,IDLENGTH,true))
  195.                     if (!checkid(prevstate, '\0')) goto errexit;
  196.                 break;
  197.             default:
  198.                continue;
  199.             }
  200.             if (getc(fp)!=KDELIM)
  201.                 warn("Closing %c missing on keyword",KDELIM);
  202.             if (prevauthor[0]!='\0'&&prevrev[0]!='\0'&&prevstate[0]!='\0'&&
  203.                 prevdate[0]!='\0' &&
  204.          ((prevsource[0]!='\0')||(prevRCS[0]!='\0'))){
  205.                 /* done; prevlocker is irrelevant */
  206.                 break;
  207.            }
  208.         }
  209.     }
  210.     VOID fclose(fp);
  211.     return true;
  212.  
  213. errexit:
  214.     prevauthor[0]=prevsource[0]=prevstate[0]=prevdate[0]=prevrev[0]= '\0';
  215.     VOID fclose(fp); return false;
  216. }
  217.  
  218.  
  219. static int getval(fp,target,maxchars,optional)
  220. register FILE *fp;
  221. char * target; int maxchars, optional;
  222. /* Function: Places a keyword value into target, but not more
  223.  * than maxchars characters. Prints an error if optional==false
  224.  * and there is no keyword. Returns true if one is found, false otherwise.
  225.  */
  226. {   register char * tp;
  227.     register int c;
  228.  
  229.     tp=target;
  230.     c=getc(fp);
  231.     if (c==KDELIM) {
  232.         if (!optional)
  233.             error("Missing keyword value");
  234.         VOID ungetc(c,fp);
  235.         return false;
  236.     } else {
  237.         while (!(c==' '||c=='\n'||c=='\t'||c==KDELIM||c==EOF)) {
  238.             if (tp-target>=maxchars-1) {
  239.                 error("keyword value too long");
  240.                 return false;
  241.             } else {
  242.                 *tp++ =c;
  243.                 c=getc(fp);
  244.             }
  245.         }
  246.         *tp= '\0';
  247. #       ifdef KEEPTEST
  248.         VOID printf("getval: %s\n",target);
  249. #       endif
  250.         while(c==' '||c=='\t') c=getc(fp); /* skip trailing blanks */
  251.     }
  252.     VOID ungetc(c,fp);
  253.     return true;
  254. }
  255.  
  256.  
  257. int getprevdate(fp,optional)
  258. FILE *fp;
  259. int optional;
  260. /* Function: reads a date prevdate; checks format
  261.  * If there is not date and optional==false, an error is printed.
  262.  * Returns false on error, true otherwise.
  263.  */
  264. {   char prevday[10];
  265.     char prevtime[10];
  266.  
  267.     prevday[0]=prevtime[0]='\0';
  268.     if (!getval(fp,prevday,9,optional)) return optional;
  269.     if (!getval(fp,prevtime,9,false)) return false;
  270.     /*process date */
  271.     prevday[2]=prevday[5]=prevday[8]=prevtime[2]=prevtime[5]='.';
  272.     prevday[9]='\0';
  273.     VOID strcpy(prevdate,prevday);
  274.     VOID strcat(prevdate,prevtime);
  275.     if (!checknum(prevdate,5)) {
  276.             error("Bad date: %s",prevdate);
  277.             prevdate[0]='\0';
  278.             return false;
  279.     }
  280.     return true;
  281. }
  282.  
  283. int checknum(sp,fields)
  284. register char * sp; int fields;
  285. {    register int dotcount;
  286.      if (sp==nil||*sp=='\0') return true;
  287.      dotcount=0;
  288.      while(*sp) {
  289.         if (*sp=='.') dotcount++;
  290.         elsif (ctab[*sp]!=DIGIT) return false;
  291.         sp++;
  292.      }
  293.      if (fields >= 0 && dotcount!=fields) return false;
  294.      return true;
  295. }
  296.  
  297.  
  298.  
  299. #ifdef KEEPTEST
  300. char * RCSfilename, * workfilename;
  301.  
  302. main(argc, argv)
  303. int  argc; char  *argv[];
  304. {
  305.     cmdid="keeptest";
  306.         while (*(++argv)) {
  307.                 if (getoldkeys(*argv))
  308.                 VOID printf("%s:  revision: %s, date: %s, author: %s, state: %s\n",
  309.                         *argv, prevrev, prevdate, prevauthor,prevstate);
  310.         VOID printf("Source: %s, RCSfile: %s\n",prevsource,prevRCS);
  311.     }
  312.     exit(0);
  313. }
  314. #endif
  315.